home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1996 September / JCSM Shareware Collection (JCS Distribution) (September 1996).ISO / prgtools / sharee17.zip / CRYPTO.C < prev    next >
C/C++ Source or Header  |  1994-06-04  |  10KB  |  379 lines

  1. /* 06/04/94 */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "crypto.h"
  6.  
  7. void CesarEncodeChar(unsigned char *Char, short Base, short Key1, short Key2, short Key3)
  8. {
  9.     register short    i, k;
  10.  
  11.     i = Base;
  12.     k = *Char;
  13.     k += Key1 * (i + 1) * (i + 2) + Key2 * (i + 3) + Key3 + 4;
  14.     k %= 256; if (k < 0) k += 256;
  15.     *Char = k;
  16. }
  17.  
  18. void CesarDecodeChar(unsigned char *Char, short Base, short Key1, short Key2, short Key3)
  19. {
  20.     register short    i, k;
  21.  
  22.     i = Base;
  23.     k = *Char;
  24.     k -= Key1 * (i + 1) * (i + 2) + Key2 * (i + 3) + Key3 + 4;
  25.     k %= 256; if (k < 0) k += 256;
  26.     *Char = k;
  27. }
  28.  
  29. void CesarEncodeString(unsigned char *String, short Key1, short Key2, short Key3, unsigned char FirstChar, unsigned char LastChar)
  30. {
  31.     register short    i, k;
  32.     short            Range;
  33.  
  34.     Range = LastChar - FirstChar + 1;
  35.     for (i = 0; i < strlen((char *) String); i++) {
  36.         k = String[i] - FirstChar;
  37.         k += Key1 * (i + 1) * (i + 2) + Key2 * (i + 3) + Key3 + 4;
  38.         k %= Range; if (k < 0) k += Range;
  39.         String[i] = k + FirstChar;
  40.     }
  41. }
  42.  
  43. void CesarDecodeString(unsigned char *String, short Key1, short Key2, short Key3, unsigned char FirstChar, unsigned char LastChar)
  44. {
  45.     register short    i, k;
  46.     short            Range;
  47.  
  48.     Range = LastChar - FirstChar + 1;
  49.     for (i = 0; i < strlen((char *) String); i++) {
  50.         k = String[i] - FirstChar;
  51.         k -= Key1 * (i + 1) * (i + 2) + Key2 * (i + 3) + Key3 + 4;
  52.         k %= Range; if (k < 0) k += Range;
  53.         String[i] = k + FirstChar;
  54.     }
  55. }
  56.  
  57. void CesarEncodeBytes(char *InputFilename, char *OutputFilename, short Key1, short Key2, short Key3)
  58. {
  59.     FILE            *input, *output;
  60.     register short    i = 0, k;
  61.  
  62.     input = fopen(InputFilename, "rb");
  63.     output = fopen(OutputFilename, "wb");
  64.     k = fgetc(input);
  65.     while (!feof(input)) {
  66.         k += Key1 * (i + 1) * (i + 2) + Key2 * (i + 3) + Key3 + 4;
  67.         k %= 256; if (k < 0) k += 256;
  68.         fputc(k, output);
  69.         i++;
  70.         k = fgetc(input);
  71.     }
  72.     fclose(input); 
  73.     fclose(output);
  74. }
  75.  
  76. void CesarDecodeBytes(char *InputFilename, char *OutputFilename, short Key1, short Key2, short Key3)
  77. {
  78.     FILE            *input, *output;
  79.     register short    i = 0, k;
  80.  
  81.     input = fopen(InputFilename, "rb");
  82.     output = fopen(OutputFilename, "wb");
  83.     k = fgetc(input);
  84.     while (!feof(input)) {
  85.         k -= Key1 * (i + 1) * (i + 2) + Key2 * (i + 3) + Key3 + 4;
  86.         k %= 256; if (k < 0) k += 256;
  87.         fputc(k, output);
  88.         i++;
  89.         k = fgetc(input);
  90.     }
  91.     fclose(input);
  92.     fclose(output);
  93. }
  94.  
  95. void CesarEncodeLines(char *InputFilename, char *OutputFilename, short Key1, short Key2, short Key3, unsigned char FirstChar, unsigned char LastChar)
  96. {
  97.     FILE            *input, *output;
  98.     unsigned char    String[260];
  99.  
  100.     input = fopen(InputFilename, "rt");
  101.     output = fopen(OutputFilename, "wt");
  102.     fgets((char *) String, 256, input);
  103.     String[strlen((char *) String) - 1] = '\0';
  104.     while (!feof(input)) {
  105.         CesarEncodeString(String, Key1, Key2, Key3, FirstChar, LastChar);
  106.         fprintf(output, "%s\n", String);
  107.         fgets((char *) String, 256, input);
  108.         String[strlen((char *) String) - 1] = '\0';
  109.     }
  110.     fclose(input); 
  111.     fclose(output);
  112. }
  113.  
  114. void CesarDecodeLines(char *InputFilename, char *OutputFilename, short Key1, short Key2, short Key3, unsigned char FirstChar, unsigned char LastChar)
  115. {
  116.     FILE            *input, *output;
  117.     unsigned char    String[260];
  118.  
  119.     input = fopen(InputFilename, "rt");
  120.     output = fopen(OutputFilename, "wt");
  121.     fgets((char *) String, 256, input);
  122.     String[strlen((char *) String) - 1] = '\0';
  123.     while (!feof(input)) {
  124.         CesarDecodeString(String, Key1, Key2, Key3, FirstChar, LastChar);
  125.         fprintf(output, "%s\n", String);
  126.         fgets((char *) String, 256, input);
  127.         String[strlen((char *) String) - 1] = '\0';
  128.     }
  129.     fclose(input); 
  130.     fclose(output);
  131. }
  132.  
  133. void ShiftEncodeChar(unsigned char *Char, short Base, short Start, short LoopA, short LoopB)
  134. {
  135.     register short    i, k;
  136.     short            MaskA, MaskB, Insert;
  137.  
  138.     MaskA = 1 << LoopA;
  139.     MaskB = 1 << LoopB;
  140.     k = *Char;
  141.     for (i = 0; i < Base; i++) {
  142.         Insert = !(Start & MaskA || Start & MaskB);
  143.         Insert <<= SHIFTLENGTH - 1;
  144.         Start >>= 1;
  145.         Start |= Insert;
  146.     }
  147.     k += Start;
  148.     k %= 256; if (k < 0) k += 256;
  149.     *Char = k;
  150. }
  151.  
  152. void ShiftDecodeChar(unsigned char *Char, short Base, short Start, short LoopA, short LoopB)
  153. {
  154.     register short    i, k;
  155.     short            MaskA, MaskB, Insert;
  156.  
  157.     MaskA = 1 << LoopA;
  158.     MaskB = 1 << LoopB;
  159.     k = *Char;
  160.     for (i = 0; i < Base; i++) {
  161.         Insert = !(Start & MaskA || Start & MaskB);
  162.         Insert <<= SHIFTLENGTH - 1;
  163.         Start >>= 1;
  164.         Start |= Insert;
  165.     }
  166.     k -= Start;
  167.     k %= 256; if (k < 0) k += 256;
  168.     *Char = k;
  169. }
  170.  
  171. void ShiftEncodeString(unsigned char *String, short Start, short LoopA, short LoopB, unsigned char FirstChar, unsigned char LastChar)
  172. {
  173.     register short    i, k;
  174.     short            Range, MaskA, MaskB, Insert;
  175.  
  176.     MaskA = 1 << LoopA;
  177.     MaskB = 1 << LoopB;
  178.     Range = LastChar - FirstChar + 1;
  179.     for (i = 0; i < strlen((char *) String); i++) {
  180.         k = String[i] - FirstChar;
  181.         k += Start;
  182.         Insert = !(Start & MaskA || Start & MaskB);
  183.         Insert <<= SHIFTLENGTH - 1;
  184.         Start >>= 1;
  185.         Start |= Insert;
  186.         k %= Range; if (k < 0) k += Range;
  187.         String[i] = k + FirstChar;
  188.     }
  189. }
  190.  
  191. void ShiftDecodeString(unsigned char *String, short Start, short LoopA, short LoopB, unsigned char FirstChar, unsigned char LastChar)
  192. {
  193.     register short    i, k;
  194.     short            Range, MaskA, MaskB, Insert;
  195.  
  196.     MaskA = 1 << LoopA;
  197.     MaskB = 1 << LoopB;
  198.     Range = LastChar - FirstChar + 1;
  199.     for (i = 0; i < strlen((char *) String); i++) {
  200.         k = String[i] - FirstChar;
  201.         k -= Start;
  202.         Insert = !(Start & MaskA || Start & MaskB);
  203.         Insert <<= SHIFTLENGTH - 1;
  204.         Start >>= 1;
  205.         Start |= Insert;
  206.         k %= Range; if (k < 0) k += Range;
  207.         String[i] = k + FirstChar;
  208.     }
  209. }
  210.  
  211. void ShiftEncodeBytes(char *InputFilename, char *OutputFilename, short Start, short LoopA, short LoopB)
  212. {
  213.     FILE            *input, *output;
  214.     register short    i = 0, k;
  215.     short            MaskA, MaskB, Insert;
  216.  
  217.     MaskA = 1 << LoopA;
  218.     MaskB = 1 << LoopB;
  219.     input = fopen(InputFilename, "rb");
  220.     output = fopen(OutputFilename, "wb");
  221.     k = fgetc(input);
  222.     while (!feof(input)) {
  223.         k += Start;
  224.         Insert = !(Start & MaskA || Start & MaskB);
  225.         Insert <<= SHIFTLENGTH - 1;
  226.         Start >>= 1;
  227.         Start |= Insert;
  228.         k %= 256; if (k < 0) k += 256;
  229.         fputc(k, output);
  230.         i++;
  231.         k = fgetc(input);
  232.     }
  233.     fclose(input); 
  234.     fclose(output);
  235. }
  236.  
  237. void ShiftDecodeBytes(char *InputFilename, char *OutputFilename, short Start, short LoopA, short LoopB)
  238. {
  239.     FILE            *input, *output;
  240.     register short    i = 0, k;
  241.     short            MaskA, MaskB, Insert;
  242.  
  243.     MaskA = 1 << LoopA;
  244.     MaskB = 1 << LoopB;
  245.     input = fopen(InputFilename, "rb");
  246.     output = fopen(OutputFilename, "wb");
  247.     k = fgetc(input);
  248.     while (!feof(input)) {
  249.         k -= Start;
  250.         Insert = !(Start & MaskA || Start & MaskB);
  251.         Insert <<= SHIFTLENGTH - 1;
  252.         Start >>= 1;
  253.         Start |= Insert;
  254.         k %= 256; if (k < 0) k += 256;
  255.         fputc(k, output);
  256.         i++;
  257.         k = fgetc(input);
  258.     }
  259.     fclose(input); 
  260.     fclose(output);
  261. }
  262.  
  263. void ShiftEncodeLines(char *InputFilename, char *OutputFilename, short Start, short LoopA, short LoopB, unsigned char FirstChar, unsigned char LastChar)
  264. {
  265.     FILE            *input, *output;
  266.     unsigned char    String[260];
  267.  
  268.     input = fopen(InputFilename, "rt");
  269.     output = fopen(OutputFilename, "wt");
  270.     fgets((char *) String, 256, input);
  271.     String[strlen((char *) String) - 1] = '\0';
  272.     while (!feof(input)) {
  273.         ShiftEncodeString(String, Start, LoopA, LoopB, FirstChar, LastChar);
  274.         fprintf(output, "%s\n", String);
  275.         fgets((char *) String, 256, input);
  276.         String[strlen((char *) String) - 1] = '\0';
  277.     }
  278.     fclose(input); 
  279.     fclose(output);
  280. }
  281.  
  282. void ShiftDecodeLines(char *InputFilename, char *OutputFilename, short Start, short LoopA, short LoopB, unsigned char FirstChar, unsigned char LastChar)
  283. {
  284.     FILE            *input, *output;
  285.     unsigned char    String[260];
  286.  
  287.     input = fopen(InputFilename, "rt");
  288.     output = fopen(OutputFilename, "wt");
  289.     fgets((char *) String, 256, input);
  290.     String[strlen((char *) String) - 1] = '\0';
  291.     while (!feof(input)) {
  292.         ShiftDecodeString(String, Start, LoopA, LoopB, FirstChar, LastChar);
  293.         fprintf(output, "%s\n", String);
  294.         fgets((char *) String, 256, input);
  295.         String[strlen((char *) String) - 1] = '\0';
  296.     }
  297.     fclose(input); 
  298.     fclose(output);
  299. }
  300.  
  301. short ShiftPeriod(short Start, short LoopA, short LoopB)
  302. {
  303.     short    i, MaskA, MaskB, Insert, Aux;
  304.  
  305.     MaskA = 1 << LoopA;
  306.     MaskB = 1 << LoopB;
  307.  
  308.     Aux = 1 << (SHIFTLENGTH - 1);
  309.     for (i = 0; i < Aux; i++) {
  310.         Insert = !(Start & MaskA || Start & MaskB);
  311.         Insert <<= SHIFTLENGTH - 1;
  312.         Start >>= 1;
  313.         Start |= Insert;
  314.     }
  315.  
  316.     Aux = Start;
  317.     i = 0;
  318.     do {
  319.         Insert = !(Start & MaskA || Start & MaskB);
  320.         Insert <<= SHIFTLENGTH - 1;
  321.         Start >>= 1;
  322.         Start |= Insert;
  323.         i++;
  324.     } while (Start != Aux);
  325.     return i;
  326. }
  327.  
  328. long IDCalculate(char *Name, short Key1, short Key2)
  329. {
  330.     short            i;
  331.     unsigned long    n;
  332.  
  333.     n = Key1 + 7369;
  334.     for (i = 0; i < strlen(Name); i++) {
  335.         n *= (Name[i] + 13);
  336.         n %= 123456789L;
  337.     }
  338.     if (n == 0)
  339.         n = Key1 * 431;
  340.     n *= (Key2 + 57);
  341.     n %= 100000L;
  342.     while (n < 10000)
  343.         n *= 10;
  344.     return n;
  345. }
  346.  
  347. void IDShortName(char *Name, char *ShortName)
  348. {
  349.     short    i, Offset;
  350.  
  351.     i = 1;
  352.     Offset = 0;
  353.     ShortName[0] = Name[0];
  354.     while (Name[i] != ' ' && i < strlen(Name))
  355.         i++;
  356.     Offset = i;
  357.     do {
  358.         i++;
  359.         ShortName[i - Offset] = Name[i];
  360.     } while (i < strlen(Name));
  361.     ShortName[i - Offset] = '\0';
  362. }
  363.  
  364. void IDLongName(char *Name, char *LongName)
  365. {
  366.     short    i, Offset;
  367.  
  368.     Offset = 0;
  369.     for (i = 0; i < strlen(Name); i++) {
  370.         LongName[i + Offset] = Name[i];
  371.         if (i == 0) {
  372.             LongName[1] = '.';
  373.             LongName[2] = ' ';
  374.             Offset = 2;
  375.         }                        
  376.     }
  377.     LongName[i + Offset] = '\0';
  378. }
  379.